package com.student.xujiang.mysmalluse.retrofit2andrxjava2;


import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.Log;
import android.widget.Toast;

import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

/**
 * Created by xujiang on 2017/3/21.
 */

public abstract class BaseObserver<T> implements Observer<BaseEntity<T>> {

    private static final String TAG = BaseObserver.class.getSimpleName();

    private Context mContext;

    private ProgressDialog mDialog;

    //onSubscribe提供了一个Disposable参数，我们调用它的dispose方法就可以终止订阅，
    // 在dialog的setOnCancelListener中，我们调用它来取消订阅，这样如果用户在请求的过程中觉得等待时间过长，
    // 点击返回键关闭进度框或者退出应用时，我们就可以取消订阅而不继续进行处理了。
    private Disposable mDisposable;

    private final int SUCCESS_CODE = 0;

    public BaseObserver(Context context,ProgressDialog dialog){
        mContext = context;
        mDialog = dialog;

        mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                mDisposable.dispose();
            }
        });
    }

    @Override
    public void onSubscribe(Disposable d) {  //onSubscribe用来随时取消和Observable的连接
        mDisposable = d;
    }

    @Override
    public void onNext(BaseEntity<T> tBaseEntity) {  //onNext用来处理Observable的返回，也就是网络连接的返回
        if(tBaseEntity.getCode() == SUCCESS_CODE){
            T t = tBaseEntity.getData();
            onHandleSuccess(t);
        } else {
            onHandleError(tBaseEntity.getCode(), tBaseEntity.getMessage());
        }
    }

    @Override
    public void onError(Throwable e) {  //onError表示发生了错误，onComplete和onError两个方法中只会并且肯定会有一个方法被调用。
        Log.d(TAG, "error:" + e.toString());

        if(mDialog != null && mDialog.isShowing()){
            mDialog.dismiss();
        }

        Toast.makeText(mContext, "网络异常，请稍后再试", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onComplete() {  //onComplete在onNext后被调用，表示完成，
        Log.d(TAG, "onComplete");

        if(mDialog != null && mDialog.isShowing()){
            mDialog.dismiss();
        }
    }

    abstract void onHandleSuccess(T t);

    void onHandleError(int code,String message){
        Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
    }

}
